#ifndef __XLX_TMSAPI_H_
#define __XLX_TMSAPI_H_

#include "xlx_common.h"

#define CHIPID_LEN 16

typedef struct{
    u32 tid;
    int delay;
    int file_type;
    u32 ota_file_size;
    char md5[32];
    char version[32];
}TMSOtaInfo;

//接口定义
typedef struct{
    void (*on_ota_start)(int t,TMSOtaInfo *info);
    char (*on_agps_file_recv)(u16 agps_file_size,char *data,int len);
    char (*on_ota_file_recv)(u32 ota_file_size,char *data,int len);
    void (*on_cmd)(int t,int seq,char *str);
    void (*on_cloud_read_value)(int group_id,char *data,int len);
}TMSDelegate;

typedef struct{
    int seq;
    int sockfd;
    int recv_wpos;//recvBuf位置
    int timeout;
    char imei[8];
    u8 chip_id[CHIPID_LEN];
    u16 agps_file_size;//agps文件大小
    u32 ota_file_size;//ota文件大小
    u32 tid;//任务id
    TMSDelegate d;
    char recvBuf[2048];
}TMSContext;


//数据包头
#pragma pack(1)
typedef struct{
    u8 fixed;//起始位
    u8 cmd;//命令号
    u8 imei[8];//imei bcd
    u16 seq;//序号
    u16 body_len;//包体长度
}TMSMsgHead;
#pragma pack()

#pragma pack(1)
typedef struct{
    u8 rseq;//应答序号
    int32_t lat;//纬度
    int32_t lng;//经度
    u16 year;//年
    u8 mon;//月
    u8 day;//日
    u8 hour;//时
    u8 min;//分
    u8 sec;//秒
    u16 millisecond;//毫秒
    u16 agps_file_size;//agps文件大小
}TMSAgps0Pkg;
#pragma pack()

//固定信息上报
#pragma pack(1)
typedef struct{
    u8 channel;
    u8 chip_id[CHIPID_LEN];
    u8 iccid[10];
    u8 imsi[8];
}TMSDeviceUpBody1;
#pragma pack()

//定时信息
#pragma pack(1)
typedef struct{
    u8 channel;
    u8 chip_id[CHIPID_LEN];
    u16 vin;
    u16 vbat;
    u8 csq;
    u8 gps_n;
    u8 bd_n;
    u8 gl_n;
    u8 lbs_n;
}TMSDeviceUpBody2;
#pragma pack()

//事件信息
#pragma pack(1)
typedef struct{
    u8 channel;
    u8 chip_id[CHIPID_LEN];
    u16 event_type;
    u8 len;
    u64 time;
}TMSDeviceUpBody3;
#pragma pack()


//设置参数
void tmsapi_set_params(TMSContext *m,char *imei,char *chip_id);

//设置回调
void tmsapi_set_delegate(TMSContext *m,TMSDelegate *delegate);

//关闭连接
void tmsapi_close_socket(TMSContext *m);

//请求下载agps文件
// gps_type:
//  1.中科微
//  2.u-blox agps 7代
//  3.u-blox apgs 8代
//  4.泰斗
//
// baseinfo:
//  基站信息MCC,MNC,LAC,Cell,ID, -SPW
void tmsapi_req_agps_file(TMSContext *m,char gps_type,char *baseinfo);


//开机需要上报的固定信息
void tmsapi_req_deviceinfo1(TMSContext *m,TMSDeviceUpBody1 *body1,char *str_ver);

//定时信息
void tmsapi_req_deviceinfo2(TMSContext *m,TMSDeviceUpBody2 *body2,char *str_lbs);

//事件信息
void tmsapi_req_deviceinfo3(TMSContext *m,TMSDeviceUpBody3 *body3,char *str,int len);

//上传日志到tms服务器,log不能长度不能超过250
void tmsapi_req_uploadlog(TMSContext *m,char *log,int log_len);

//请求读取云端参数
void tmsapi_req_read_cloud_args(TMSContext *m,char group_id);

//请求写云端参数
void tmsapi_req_write_cloud_args(TMSContext *m,char group_id,char *text,int text_len);

//上报ota升级情况到服务器
//status:
//  0x01. 待升级
//  0x02. 升级中
//  0x03. 升级成功,上报版本号给服务器比对
//  0x04. 任务过期
//  0x05. 取消升级
//  0x06. 任务失败
void tmsapi_req_upload_ota_status(TMSContext *m,uint32_t tid,char status,char *version);

//请求下载ota文件，pkgseq从1开始,分片大小 = pkg_size *128
void tmsapi_req_ota_file(TMSContext *m,uint32_t tid,uint32_t pkgseq,char pkg_size);

//响应服务器下发的指令
void tmsapi_rsp_command(TMSContext *m,u16 seq,int cmd_type,char *rsp_text);

//连接服务器
int tmsapi_connect_server(TMSContext *m,const char *ip,int port);

//服务器数据交互
void tmsapi_run_data(TMSContext *m);

//设置等待超时时间
void tmsapi_set_timeout(TMSContext *m,int timeout);

#endif